package com.grizz.snake.resource;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.SpriteSheet;
import org.newdawn.slick.tiled.TiledMap;


public class ResourceContainer {
	private Properties prop = new Properties();
	
	/**
	 * Tworzy nowa instancje klasy i od razu laduje plik z lista resourcow.
	 */
	public ResourceContainer() {
		try {
			prop.load(getClass().getClassLoader().getResourceAsStream("resources/resources.properties"));
		} catch (IOException e) { /*ignore*/ }
	}
	
	/**
	 * Laduje obiekt typu Image o podanej nazwie.
	 * @param name - nazwa pliku z obrazkiem (bez rozszerzenia)
	 * @return Image o podanej nazwie
	 * @throws SlickException
	 */
	public Image getImage(String name) throws SlickException{
		String property = prop.getProperty(name);
		return new Image(getInputStream(property), new File(property).getName(), false);
	}
	
	/**
	 * Laduje obiekt typu TiledMap o podanej nazwie. Nazwa TiledMapy to nazwa pliku bez rozszerzenia.<br>
	 * Przykladowo:<br>
	 * plik: defaultMap.tmx -> nazwa: defaultMap<br><br>
	 * 
	 * Wszystkie TileSety dla danej mapy maja znajdowac sie w folderze o tej samej nazwie co mapa.<br>
	 * Przykladowo:<br>
	 * plik: resources/maps/defaultMap.tmx -> folder z TileSetami: resources/maps/defaultMap/
	 * @param name - nazwa pliku z TiledMapa (bez rozszerzenia)
	 * @return TiledMapa o podanej nazwie
	 * @throws SlickException 
	 */
	public TiledMap getTiledMap(String name) throws SlickException{
		String property = prop.getProperty(name);
		return new TiledMap(getInputStream(property), property.substring(0, property.indexOf(name))+name);
	}
	
	/**
	 * Laduje plik obrazu w ktorym sie znajduje SpriteSheet i zwraca obiekt odpowiedniego typu
	 * @param name - nazwa pliku z obrazkiem (bez rozszerzenia)
	 * @param tileWidth - szerokosc Tile
	 * @param tileHeight - wysokosc Tile
	 * @return SpriteSheet powstaly z zaladowanego obrazu
	 * @throws SlickException
	 */
	public SpriteSheet getSpriteSheet(String name, int tileWidth, int tileHeight) throws SlickException{
		return new SpriteSheet(getImage(name), tileWidth, tileHeight);
	}
	
	private InputStream getInputStream(String property){
		return getClass().getClassLoader().getResourceAsStream(property);
	}
}
